﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsUsuario_CRN:clsEstado,IControlEstados
    {
        public string LoginName { get; set; }
        public string Contrasenia { get; set; }
        public string Apellidos { get; set; }
        public string Nombres { get; set; }
        /*Los tipos de usuario que pueden haber son:
         * Controlador
         * Perito
         * Capturista*/
        public string Tipo { get; set; }

        //Esta propiedad almacena temporalmente al usuario que inicia sesión
        public static clsUsuario_CRN UsuarioActivo { get; set; }

        public clsUsuario_CRN(string loginName):base()
        {
            this.LoginName = loginName;
            this.Apellidos = string.Empty;
            this.Contrasenia = string.Empty;
            this.Nombres = string.Empty;
            this.Tipo = string.Empty;
        }

        public clsUsuario_CRN():base()
        {
            this.LoginName = string.Empty;
            this.Apellidos = string.Empty;
            this.Contrasenia = string.Empty;
            this.Nombres = string.Empty;
            this.Tipo = string.Empty;
        }

        #region métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaUsuario();
                else
                {
                    if (this.EsModificado)
                        return ModificaUsuario();
                    else
                        return EliminaUsuario();
                }
            }
            return false;
        }

        private bool CreaUsuario()
        {
            clsUsuario_CD objUsuario = new clsUsuario_CD();
            if(objUsuario.CreaNuevoUsuario(this))
            {
                this.EsModificado = true;
                return true;
            }
            return false;
        }

        private bool ModificaUsuario()
        {
            clsUsuario_CD objUsuario = new clsUsuario_CD();
            return objUsuario.ModificaUsuario(this);
        }

        private bool EliminaUsuario()
        {
            clsUsuario_CD objUsuario_CD = new clsUsuario_CD();
            return objUsuario_CD.EliminaUsuario(this);
        }

        public bool DatosValidos()
        {
            if (this.LoginName.Length == 0)
            {
                MessageBox.Show("El nombre de usuario no puede quedar vacío./nCorrija este dato.",
                    "Error de validación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            //if(this.EsNuevo && (this.
            if (this.Contrasenia.Length == 0)
            {
                MessageBox.Show("Debe de escribir una contraseña, ésta no puede quedar vacía./nCorrija este dato.",
                    "Error de validación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.LoginName.Length == 0)
            {
                MessageBox.Show("El nombre de usuario no puede quedar vacío./nCorrija este dato.",
                    "Error de validación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.EsEliminado && (this.LoginName == clsUsuario_CRN.UsuarioActivo.LoginName))
            {
                MessageBox.Show("El usuario activo no puede ser eliminado./nCorrija este dato.",
                   "Error de validación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.EsModificado = true;
                return false;
            }

            if (this.EsEliminado && (this.LoginName == "Controlador"))
            {
                MessageBox.Show("El usuario Controlador no puede eliminarse./nCorrija este dato.",
                   "Error de validación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.EsModificado = true;
                return false;
            }
            return true;
        }

        public static clsUsuario_CRN RecuperaUsuario(string loginName)
        {
            clsUsuario_CD objUsuario_CD = new clsUsuario_CD();
            dsAvaluos.UsuariosRow objUsuarioRecuperado = objUsuario_CD.RecuperaUsuario(loginName);
            clsUsuario_CRN objUsuario = new clsUsuario_CRN(loginName);
            if (objUsuarioRecuperado != null)
            {
                objUsuario.LoginName = objUsuarioRecuperado.LoginName;
                objUsuario.Apellidos = objUsuarioRecuperado.Apellidos;
                objUsuario.Contrasenia = objUsuarioRecuperado.Contrasenia;
                objUsuario.EsModificado = true;
                objUsuario.Nombres = objUsuarioRecuperado.Nombres;
                objUsuario.Tipo = objUsuarioRecuperado.Tipo;
            }
            return objUsuario;
        }

        public static BindingList<clsUsuario_CRN> RecuperaUsuarios()
        {
            BindingList<clsUsuario_CRN> blUsuarios = new BindingList<clsUsuario_CRN>();
            clsUsuario_CD objUsuario_CD = new clsUsuario_CD();
            BindingList<dsAvaluos.UsuariosRow> UsuariosRecuperados = objUsuario_CD.RecuperaUsuarios();
            foreach (dsAvaluos.UsuariosRow filaUsuario in UsuariosRecuperados)
            {
                clsUsuario_CRN objUsuario = new clsUsuario_CRN(filaUsuario.LoginName);
                if (UsuariosRecuperados != null)
                {
                    objUsuario.Apellidos = filaUsuario.Apellidos;
                    objUsuario.Contrasenia = filaUsuario.Contrasenia;
                    objUsuario.EsModificado = true;
                    objUsuario.Nombres = filaUsuario.Nombres;
                    objUsuario.Tipo = filaUsuario.Tipo;
                    blUsuarios.Add(objUsuario);
                }
            }
            return blUsuarios;
        }

        public bool IniciaSesion()
        {
            clsUsuario_CD objUsuario_CD = new clsUsuario_CD();
            if (objUsuario_CD.RecuperaUsuario(this.LoginName) != null)
            {
                clsUsuario_CRN.UsuarioActivo = clsUsuario_CRN.RecuperaUsuario(this.LoginName);
                if (clsUsuario_CRN.UsuarioActivo.Contrasenia == this.Contrasenia)
                {
                   
                    return true;
                }
                else
                {
                    MessageBox.Show("La contraseña ingresada es incorrecta.\nVerifique que los datos ingresados esten escritos de manera correcta.",
                   "Error en Inicio de Sesión", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    clsUsuario_CRN.UsuarioActivo = null;
                    return false;
                }
            }
            else
            {
                MessageBox.Show("No se encuentra registrado el nombre de usuario:" + this.LoginName +"\nVerifique que los datos ingresados esten escritos de manera correcta.",
                    "Error en Inicio de Sesión", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        public static bool CerrarSesion()
        {
            clsUsuario_CRN.UsuarioActivo = null;
            return true;
        }
        

        #endregion
    }
}
